package copy;

import java.io.*;

public class CopyTest {
    public static void main(String[] args) {
        File file1 = new File("day10-code/src/asda/A.java");
        File file2 = new File("day10-code/src/copy/");

        try {
            copyFile(file1, file2);
        } catch (IOException e) {
            e.printStackTrace();
        }

        File file = new File("");
        File tofile = new File("day10-code/src/copy/");
        try {
            copyFolder(file, tofile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 文件拷贝
    public static void copyFile(File file, File tofile) throws IOException {
        //数据校验
        if (!file.exists()) {
            throw new FileNotFoundException("源文件文件不存在");
        }
        if (!file.isFile()) {
            throw new IOException("源文件不是文件");
        }
        if (!tofile.exists()) {
            tofile.mkdirs();
        }
        File destFile = new File(tofile, file.getName());

        try (  //将文件夹拷贝到另一个文件夹
               BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
               BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile))) {
            //创建缓冲流
            byte[] buffer = new byte[1024];
            //循环读取
            int len;
            while ((len = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 文件夹拷贝
    public static void copyFolder(File mkdir1, File mkdir2) throws IOException {
        //判断要拷贝的文件夹是否存在
        if (!mkdir1.exists()) {
            System.out.println("您要拷贝的文件夹不存在");
        }
        //判断目标文件夹是否存在
        if (!mkdir2.exists()) {
            mkdir2.mkdirs();
        }

        // 拼凑目标文件对象
        File destFile = new File(mkdir2, mkdir1.getName());
        if (!destFile.exists()) {
            destFile.mkdirs();
        }
        File[] files = mkdir1.listFiles();//获取文件夹下的所有文件

        //循环遍历
        for (File zifile : files) {
            if (zifile.isFile()) {//判断是不是文件
                copyFile(zifile, destFile);
            } else {//判断是不是文件夹
                // 拼凑目标文件对象
                File destFile2 = new File(destFile, zifile.getName());
                if (!destFile2.exists()) {
                    destFile2.mkdirs();
                }
                // 递归调用copyDirectory
                copyFolder(zifile, new File(mkdir2, zifile.getName()));
            }
        }
    }
}
